Many modern computing systems include multiple processors optimized for certain processing tasks. For example, a common architecture includes a central processing unit (CPU) and a graphics processing unit (GPU). In this architecture, an application executes on the CPU and generates graphics data and rendering instructions for the GPU to execute for rendering a scene for display. The GPU is optimized for highly parallelized processing tasks, making it well suited for graphics processing. Some development platforms make the parallel computational elements of the GPU available for applications beyond graphics rendering. Other applications that can benefit from optimizations in the GPU include physics modeling and simulation, computational biology, cryptography, and others.
To realize the benefits of GPU computing, applications need access to languages and libraries for carrying out sequential tasks on the CPU, or “host,” and access to languages and libraries for carrying out parallel tasks on the GPU, or “device.” Given access to both the host and device, a developer can apportion processing tasks between the processors. An SDE can provide this access through a variety of libraries and application programming interfaces (APIs) that allow host and device portions of an application to blend into a single body of source code. Such a body of code is referred to as integrated source, in that host code portions and device code portions are integrated into a single source code file. Such an SDE is sometimes referred to as a source integrated heterogeneous programming environment. “Heterogeneous” refers to the integration of source code that executes on at least two different types of processors. For example, certain source code can only execute on a CPU, other source code may only execute on a GPU, while yet other source code can execute on either a CPU or GPU.